#include <iostream>
#include "big_num.h"

// 大数相乘
// 输出乘数a、b
// 返回相乘的结果
std::string big_mul(const std::string &a, const std::string &b, int base) {
    size_t buf_size = a.size() + b.size(); // 计算结果的长度
    int *buf = new int[buf_size](); // 保存计算的中间结果

    // 计算所有位数互相乘
    for (int i = 0; i < a.size(); ++i) {
        for (int j = 0; j < b.size(); ++j) {
            buf[i + j + 1] += (a[i] - '0') * (b[j] - '0'); //相乘结果
        }
    }

    // 处理进位
    for (auto i = buf_size - 1; i >= 0; i--) {
        buf[i - 1] += buf[i] / base; // 进位
        buf[i] %= base;
    }

    // 为了去掉高位的0, 对高位0计数
    int zero_count = 0;
    for (int i = 0; i < buf_size; i++) {
        if (buf[i] != 0) {
            break;
        }
        zero_count++;
    }

    size_t res_size = buf_size - zero_count; // 结果char数组的长度
    char *char_res = new char[res_size]();
    for (int i = 0; i < res_size; i++) {
        char_res[i] = char('0' + buf[zero_count + i]);
    }

    std::string res;
    if (res_size == 0) {
        // 结果为0
        res = "0";
    } else {
        res = std::string(char_res, res_size);
    }

    delete[] buf;
    delete[] char_res;
    return std::move(res);
}
